<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 * ZenAuth uCMS CodeIgniter Authorization Library 
 *          v 0.4

  Specifikáció
  A library betöltése:
  $this->load->library('zen_auth');

  Szabályok:
  A rendszer wordpress-szerű adatbázis táblát használ.
  A felhasználói szint az usermeta_data táblában tárolódik.
  Minden felhasználó regisztrációkor kap egy felhasználói szintet.
  Ezt a szintet csak adminisztrátor módosíthatja.
  A legmagasabb felhasználói szint a 0 - adminisztrátor
  (Nem kívánjuk előre megmondani a szintek mennyiségét,
  így 0-ról kezdjük a számolásukat.)
  A felhasználói szintek 0-tól n-ig tartanak. A szám minél magasabb,
  annál kevesebb jogosultsága van az adott felhasználónak.

 *
 * @author bg
 */
class Zen_auth {
    
    function __construct() {
        // codeigniter instance is needed
        $CI = & get_instance();
        // user model is needed
        $CI->load->model('user_model');
        // load session data into local variable
        $this->ZenAuthSessionData = $CI->session->userdata('ZenAuthSessionData');
    }

    /**
     * Sikeres bejelentkezés esetén elkészíti (a library SAJÁT! használatára)
     * a sessiont. Ha stay_logged_in == TRUE, akkor cookie lejárati idejét
     * 0-ra állítja. 
     * Sikeres bejelentkezéskor TRUE visszatérési értéket ad.
     * Sikertelen bejelentkezéskor hibát fog dobmi a model, amit a controllerben kell elkapni.
     * 
     * Az elkészített session = array(), tartalmazza:
     *      Belépési idő
     *      Felhasználónév
     *      Felhasználói szint
     * 
     *  A cookiet titkosítani kell!
     * 
     * @param type $username
     * @param type $user_pass
     * @param type $stay_logged_in 
     */
    function login($username, $user_pass, $stay_logged_in = FALSE) {
        // codeigniter instance is needed
        $CI = & get_instance();
        //if there is no user info the user_model will throw login failed exception
        // get user info from user_model
        $user_info = $CI->user_model->login_check($username, $user_pass);
        
        if($user_info == NULL) return null;
        $session_data['ZenAuthSessionData'] = array(
            'user_id' => $user_info->user_id,
            'user_login' => $user_info->user_login,
            'user_status' => $user_info->user_status, // itt lehet majd ellenőrzés felhasználói szintre
            'display_name' => $user_info->display_name,
            'user_logged_in' => TRUE
        );
        // assume session library is already loaded
        $CI->session->set_userdata($session_data);
    }

    /**
     * 
     * TRUE ha van felhasználó bejelentkezve, egyébként FALSE.
     * 
     */
    function is_user_logged_in() {
        if (isset($this->ZenAuthSessionData))
            return $this->ZenAuthSessionData['user_logged_in'];
        else
            return false;
    }

    /**
     * 
     * 
     *  TRUE ha a bejelentkezett felhasználó rendelkezik a szükséges (paramétersoron megadott)
     *  felhasználói szinttel.
     *  FALSE ha nincs bejelentkezve, vagy nem rendelkezik a szinttel
     * 
     * 
     * @param type $level 
     */
    function is_user_level($level) {
        if ($this->is_user_logged_in() == TRUE) {
            if ($this->ZenAuthSessionData['user_level'] >= $level)
                return true;
        }else
            return false;
    }

    /**
     * 
     * 
     * Erős 12 karakteres jelszót ad vissza.
     */
    function _generate_password($length = 12) {
        $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=!@()_+,.';

        $str = '';
        $max = strlen($chars) - 1;

        for ($i = 0; $i < $length; $i++)
            $str .= $chars[rand(0, $max)];

        return $str;
    }

    /**
     *   Visszaadja a felhasználó user nevét.
     *      Ha nincs bejelentkezve NULL-t ad vissza.
     * 
     * 
     */
    function get_user_login_name() {
        if ($this->is_user_logged_in() == TRUE) {
            return $this->ZenAuthSessionData['user_login'];
        }else
            return NULL;
    }
    
    /**
     *   Visszaadja a felhasználó display nevét.
     *      Ha nincs bejelentkezve NULL-t ad vissza.
     * 
     * 
     */
    function get_user_display_name() {
        if ($this->is_user_logged_in() == TRUE) {
            return $this->ZenAuthSessionData['display_name'];
        }else
            return NULL;
    }

    /**
     * Refreshes the current user login info
     */
    function refresh_session_user_data(){
        // codeigniter instance is needed
        $CI = & get_instance();
        //if there is no user info the user_model will throw login failed exception
        // get user info from user_model
        // session data
        $zensessdata = $CI->session->userdata("ZenAuthSessionData");
        // get current user info
        $user_info = $CI->user_model->get_user($zensessdata['user_id']);
        // in case of error
        if($user_info == NULL) show_404('Felhasználói hiba. Kérjük hívja ügyfélszolgálatunkat!');
        $session_data['ZenAuthSessionData'] = array(
            'user_id' => $user_info->user_id,
            'user_login' => $user_info->user_login,
            'user_status' => $user_info->user_status, // itt lehet majd ellenőrzés felhasználói szintre
            'display_name' => $user_info->display_name,
            'user_logged_in' => TRUE
        );
        // assume session library is already loaded
        $CI->session->set_userdata($session_data);
    }
    
    /**
     *   Session destroy.
     */
    function logout(){
        $CI = & get_instance();
        $CI->session->sess_destroy();
    }
    
}